home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / man / man.3 / Preserve.3 < prev    next >
Text File  |  1995-07-21  |  9KB  |  296 lines

  1. '\"
  2. '\" Copyright (c) 1990 The Regents of the University of California.
  3. '\" All rights reserved.
  4. '\"
  5. '\" Permission is hereby granted, without written agreement and without
  6. '\" license or royalty fees, to use, copy, modify, and distribute this
  7. '\" documentation for any purpose, provided that the above copyright
  8. '\" notice and the following two paragraphs appear in all copies.
  9. '\"
  10. '\" IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
  11. '\" FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
  12. '\" ARISING OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  13. '\" CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14. '\"
  15. '\" THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  16. '\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  17. '\" AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  18. '\" ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  19. '\" PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  20. '\" 
  21. '\" $Header: /user6/ouster/wish/man/RCS/Preserve.3,v 1.5 93/04/01 09:41:54 ouster Exp $ SPRITE (Berkeley)
  22. '\" 
  23. .\" The definitions below are for supplemental macros used in Tcl/Tk
  24. .\" manual entries.
  25. .\"
  26. .\" .HS name section [date [version]]
  27. .\"    Replacement for .TH in other man pages.  See below for valid
  28. .\"    section names.
  29. .\"
  30. .\" .AP type name in/out [indent]
  31. .\"    Start paragraph describing an argument to a library procedure.
  32. .\"    type is type of argument (int, etc.), in/out is either "in", "out",
  33. .\"    or "in/out" to describe whether procedure reads or modifies arg,
  34. .\"    and indent is equivalent to second arg of .IP (shouldn't ever be
  35. .\"    needed;  use .AS below instead)
  36. .\"
  37. .\" .AS [type [name]]
  38. .\"    Give maximum sizes of arguments for setting tab stops.  Type and
  39. .\"    name are examples of largest possible arguments that will be passed
  40. .\"    to .AP later.  If args are omitted, default tab stops are used.
  41. .\"
  42. .\" .BS
  43. .\"    Start box enclosure.  From here until next .BE, everything will be
  44. .\"    enclosed in one large box.
  45. .\"
  46. .\" .BE
  47. .\"    End of box enclosure.
  48. .\"
  49. .\" .VS
  50. .\"    Begin vertical sidebar, for use in marking newly-changed parts
  51. .\"    of man pages.
  52. .\"
  53. .\" .VE
  54. .\"    End of vertical sidebar.
  55. .\"
  56. .\" .DS
  57. .\"    Begin an indented unfilled display.
  58. .\"
  59. .\" .DE
  60. .\"    End of indented unfilled display.
  61. .\"
  62. '\"    # Heading for Tcl/Tk man pages
  63. .de HS
  64. .ds ^3 \\0
  65. .if !"\\$3"" .ds ^3 \\$3
  66. .if '\\$2'cmds'       .TH \\$1 1 \\*(^3 \\$4
  67. .if '\\$2'lib'        .TH \\$1 3 \\*(^3 \\$4
  68. .if '\\$2'tcl'        .TH \\$1 n \\*(^3 Tcl "Tcl Built-In Commands"
  69. .if '\\$2'tk'         .TH \\$1 n \\*(^3 Tk "Tk Commands"
  70. .if '\\$2'tclc'        .TH \\$1 3 \\*(^3 Tcl "Tcl Library Procedures"
  71. .if '\\$2'tkc'         .TH \\$1 3 \\*(^3 Tk "Tk Library Procedures"
  72. .if '\\$2'tclcmds'         .TH \\$1 1 \\*(^3 Tk "Tcl Applications"
  73. .if '\\$2'tkcmds'         .TH \\$1 1 \\*(^3 Tk "Tk Applications"
  74. .if t .wh -1.3i ^B
  75. .nr ^l \\n(.l
  76. .ad b
  77. ..
  78. '\"    # Start an argument description
  79. .de AP
  80. .ie !"\\$4"" .TP \\$4
  81. .el \{\
  82. .   ie !"\\$2"" .TP \\n()Cu
  83. .   el          .TP 15
  84. .\}
  85. .ie !"\\$3"" \{\
  86. .ta \\n()Au \\n()Bu
  87. \&\\$1    \\fI\\$2\\fP    (\\$3)
  88. .\".b
  89. .\}
  90. .el \{\
  91. .br
  92. .ie !"\\$2"" \{\
  93. \&\\$1    \\fI\\$2\\fP
  94. .\}
  95. .el \{\
  96. \&\\fI\\$1\\fP
  97. .\}
  98. .\}
  99. ..
  100. '\"    # define tabbing values for .AP
  101. .de AS
  102. .nr )A 10n
  103. .if !"\\$1"" .nr )A \\w'\\$1'u+3n
  104. .nr )B \\n()Au+15n
  105. .\"
  106. .if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n
  107. .nr )C \\n()Bu+\\w'(in/out)'u+2n
  108. ..
  109. '\"    # BS - start boxed text
  110. '\"    # ^y = starting y location
  111. '\"    # ^b = 1
  112. .de BS
  113. .br
  114. .mk ^y
  115. .nr ^b 1u
  116. .if n .nf
  117. .if n .ti 0
  118. .if n \l'\\n(.lu\(ul'
  119. .if n .fi
  120. ..
  121. '\"    # BE - end boxed text (draw box now)
  122. .de BE
  123. .nf
  124. .ti 0
  125. .mk ^t
  126. .ie n \l'\\n(^lu\(ul'
  127. .el \{\
  128. .\"    Draw four-sided box normally, but don't draw top of
  129. .\"    box if the box started on an earlier page.
  130. .ie !\\n(^b-1 \{\
  131. \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
  132. .\}
  133. .el \}\
  134. \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
  135. .\}
  136. .\}
  137. .fi
  138. .br
  139. .nr ^b 0
  140. ..
  141. '\"    # VS - start vertical sidebar
  142. '\"    # ^Y = starting y location
  143. '\"    # ^v = 1 (for troff;  for nroff this doesn't matter)
  144. .de VS
  145. .mk ^Y
  146. .ie n 'mc \s12\(br\s0
  147. .el .nr ^v 1u
  148. ..
  149. '\"    # VE - end of vertical sidebar
  150. .de VE
  151. .ie n 'mc
  152. .el \{\
  153. .ev 2
  154. .nf
  155. .ti 0
  156. .mk ^t
  157. \h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n'
  158. .sp -1
  159. .fi
  160. .ev
  161. .\}
  162. .nr ^v 0
  163. ..
  164. '\"    # Special macro to handle page bottom:  finish off current
  165. '\"    # box/sidebar if in box/sidebar mode, then invoked standard
  166. '\"    # page bottom macro.
  167. .de ^B
  168. .ev 2
  169. 'ti 0
  170. 'nf
  171. .mk ^t
  172. .if \\n(^b \{\
  173. .\"    Draw three-sided box if this is the box's first page,
  174. .\"    draw two sides but no top otherwise.
  175. .ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c
  176. .el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c
  177. .\}
  178. .if \\n(^v \{\
  179. .nr ^x \\n(^tu+1v-\\n(^Yu
  180. \kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c
  181. .\}
  182. .bp
  183. 'fi
  184. .ev
  185. .if \\n(^b \{\
  186. .mk ^y
  187. .nr ^b 2
  188. .\}
  189. .if \\n(^v \{\
  190. .mk ^Y
  191. .\}
  192. ..
  193. '\"    # DS - begin display
  194. .de DS
  195. .RS
  196. .nf
  197. .sp
  198. ..
  199. '\"    # DE - end display
  200. .de DE
  201. .fi
  202. .RE
  203. .sp .5
  204. ..
  205. .HS Tk_Preserve tkc
  206. .BS
  207. .SH NAME
  208. Tk_Preserve, Tk_Release, Tk_EventuallyFree \- avoid freeing storage while it's being used
  209. .SH SYNOPSIS
  210. .nf
  211. \fB#include <tk.h>\fR
  212. .sp
  213. \fBTk_Preserve\fR(\fIclientData\fR)
  214. .sp
  215. \fBTk_Release\fR(\fIclientData\fR)
  216. .sp
  217. \fBTk_EventuallyFree\fR(\fIclientData, freeProc\fR)
  218. .SH ARGUMENTS
  219. .AS Tk_FreeProc clientData
  220. .AP ClientData clientData in
  221. Token describing structure to be freed or reallocated.  Usually a pointer
  222. to memory for structure.
  223. .AP Tk_FreeProc *freeProc in
  224. Procedure to invoke to free \fIclientData\fR.
  225. .BE
  226.  
  227. .SH DESCRIPTION
  228. .PP
  229. These three procedures help implement a simple reference count mechanism
  230. for managing storage.  They are designed to solve a problem
  231. having to do with widget deletion.  When a widget is deleted, its
  232. widget record (the structure holding information specific to the
  233. widget) must be returned to the storage allocator.
  234. However, it's possible that the widget record is in active use
  235. by one of the procedures on the stack at the time of the deletion.
  236. This can happen, for example, if the command associated with a button
  237. widget causes the button to be destroyed:  an X event causes an
  238. event-handling C procedure in the button to be invoked, which in
  239. turn causes the button's associated Tcl command to be executed,
  240. which in turn causes the button to be deleted, which in turn causes
  241. the button's widget record to be de-allocated.
  242. Unfortunately, when the Tcl command returns, the button's
  243. event-handling procedure will need to reference the
  244. button's widget record.
  245. Because of this, the widget record must not be freed as part of the
  246. deletion, but must be retained until the event-handling procedure has
  247. finished with it.
  248. In other situations where the widget is deleted, it may be possible
  249. to free the widget record immediately.
  250. .PP
  251. \fBTk_Preserve\fR and \fBTk_Release\fR
  252. implement short-term reference counts for their \fIclientData\fR
  253. argument.
  254. The \fIclientData\fR argument identifies an object and usually
  255. consists of the address of a structure.
  256. The reference counts guarantee that an object will not be freed
  257. until each call to \fBTk_Preserve\fR for the object has been
  258. matched by calls to \fBTk_Release\fR.
  259. There may be any number of unmatched \fBTk_Preserve\fR calls
  260. in effect at once.
  261. .PP
  262. \fBTk_EventuallyFree\fR is invoked to free up its \fIclientData\fR
  263. argument.
  264. It checks to see if there are unmatched \fBTk_Preserve\fR calls
  265. for the object.
  266. If not, then \fBTk_EventuallyFree\fR calls \fIfreeProc\fR immediately.
  267. Otherwise \fBTk_EventuallyFree\fR records the fact that \fIclientData\fR
  268. needs eventually to be freed.
  269. When all calls to \fBTk_Preserve\fR have been matched with
  270. calls to \fBTk_Release\fR then \fIfreeProc\fR will be called by
  271. \fBTk_Release\fR to do the cleanup.
  272. .PP
  273. All the work of freeing the object is carried out by \fIfreeProc\fR.
  274. \fIFreeProc\fR must have arguments and result that match the
  275. type \fBTk_FreeProc\fR:
  276. .nf
  277. .RS
  278. typedef void Tk_FreeProc(ClientData \fIclientData\fR);
  279. .RE
  280. .fi
  281. The \fIclientData\fR argument to \fIfreeProc\fR will be the
  282. same as the \fIclientData\fR argument to \fBTk_EventuallyFree\fR.
  283. .PP
  284. This mechanism can be used to solve the problem described above
  285. by placing \fBTk_Preserve\fR and \fBTk_Release\fR calls around
  286. actions that may cause undesired storage re-allocation.  The
  287. mechanism is intended only for short-term use (i.e. while procedures
  288. are pending on the stack);  it will not work efficiently as a
  289. mechanism for long-term reference counts.
  290. The implementation does not depend in any way on the internal
  291. structure of the objects being freed;  it keeps the reference
  292. counts in a separate structure.
  293.  
  294. .SH KEYWORDS
  295. free, reference count, storage
  296.